namespace Plugins.Engine.Internal
{
    using Plugins.Core.Interfaces;
    using Plugins.Interfaces;

    internal interface IPluginHostInternal : IPluginHost, IPluginActivator, IPluginCollectionContainer, IPluginEnumerator
    {
        IPluginContextInternal this[IPluginAssemblyConfiguration configuration] { get; }

        IPluginObjectCollection<T> Load<T>(IPluginAssemblyConfiguration pluginConfiguration);
        IPluginObjectCollection<T> Unload<T>(IPluginAssemblyConfiguration pluginConfiguration);

        IPluginContextInternal LoadContext(IPluginAssemblyConfiguration pluginConfiguration);
        IPluginContextInternal UnloadContext(IPluginAssemblyConfiguration configuration);

        IPluginObjectCollection<T> LoadPlugin<T>(IPluginContextInternal context);
        IPluginObjectCollection<T> UnloadPlugin<T>(IPluginContextInternal context);

        void RegisterPlugin(IPluginObject plugin);
        void UnregisterPlugin(IPluginObject plugin);

        //void Clear();
        //void Unload(IPluginObject plugin);
        //void UnloadPlugin(IPluginObjectInternal plugin);
        //IEnumerable<IPluginObjectInternal> InternalPlugins { get; }
    }
}

